package com.atlzk.group.order.controller;

import com.alipay.api.AlipayApiException;
import com.alipay.api.internal.util.AlipaySignature;
import com.atlzk.group.order.entity.OrderEntity;
import com.atlzk.group.order.service.AlipayService;
import com.atlzk.group.order.service.OrderService;
import com.atlzk.group.order.utils.AlipayTemplate;
import com.atlzk.group.order.utils.ToMap;
import com.atlzk.group.order.vo.PayAsyncVo;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

/**
 * @author King
 * @date 2021/6/21 - 9:29
 */
@RequestMapping("/pay/pay")
@Controller
@Slf4j
public class PayController {

    @Autowired
    private OrderService orderService;

    @Autowired
    private AlipayService alipayService;

    @Autowired
    private AlipayTemplate alipayTemplate;

    /**
     * 支付宝支付
     *
     * @param order
     * @return
     */
    @ResponseBody
    @PostMapping(value = "/zfbPayMoney", produces = "text/html")
    public String zfbPayMoney(@RequestBody OrderEntity order) {
        return orderService.zfbPayMoney(order);
    }

    @RequestMapping("/callBack")
    public ModelAndView callBack() {
        ModelAndView callBack = new ModelAndView("callBack");
        return callBack;
    }

    /**
     * 支付成功后的回调函数
     *   rsaCheckV1 验签方法主要用于支付接口的返回参数的验签比如：
     *              当面付，APP支付，手机网站支付，电脑网站支付 这些接口都是使用rsaCheckV1方法验签的
     *
     *   rsaCheckV2 验签方法主要是
     *              用于生活号相关的事件消息和口碑服务市场订购信息等发送到应用网关地址的异步信息的验签
     *
     * @param payAsyncVo 自定义vo ，接收支付宝回调的参数，便于处理订单
     * @param request  接收支付宝回调的参数，便于验证签名
     * @return success: 告诉支付宝，验证成功，不再请求我的回调接口
     *                  如果返回其他，则继续请求，直到成功或者请求到24小时后，一共请求8次
     */
    @PostMapping("/alipaySuccess")
    @CrossOrigin
    @ResponseBody
    public String notify(PayAsyncVo payAsyncVo,HttpServletRequest request){
        //转换为map集合
        Map<String, String> requestMap = ToMap.RequestToMap(request);
        try {
            //确定是否为支付宝的回调-验签
            boolean rsaCheckV1 = AlipaySignature.rsaCheckV1(
                    requestMap,
                    alipayTemplate.getAlipay_public_key(),
                    alipayTemplate.getCharset(),
                    alipayTemplate.getSign_type());
            //如果这个为false 返回错误信息
            if (rsaCheckV1){
                //验证成功，去修改订单状态
                alipayService.zfbCallBack(payAsyncVo);
            }else{
                log.info("支付宝回调验签失败");
                return "failure";
            }
        } catch (AlipayApiException e) {
            e.printStackTrace();
        }
        return "success";
    }


}
